/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controlador.Service.Almacen;

import Controlador.Bean.Almacen.Kardex;
import Controlador.Bean.Almacen.Producto;
import Controlador.Bean.Almacen.ProductoxAlmacen;
import Controlador.Bean.Almacen.ProdxSolicitudMovimiento;
import Data.config.SessionFac;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.session.SqlSession;

/**
 *
 * @author César
 */
public class ServicioProducto {
    
    public Double obtenerPrecio(String idProducto){
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        Double data;
        try{
            data = (Double)sqlsession.selectOne("Data.Almacen.ServicioProducto.obtenerPrecio", idProducto);
        }finally{
            sqlsession.close();
        }
        return data;
    }
    
    public Double obtenerStock(String idProducto){
        Producto data;
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        try{
            HashMap<String, String> hm = new HashMap<>();
            hm.put("id", "%"+idProducto.toUpperCase()+"%");
            hm.put("nombre", "%%");
            data = sqlsession.selectOne("Data.Almacen.ServicioProducto.filtrarProductos", hm);
            if(data==null)
                return 0.0;
            else
                return data.getCantidad();
        }finally{
            sqlsession.close();
        }
    }
    
    public List<Producto> filtrarProductos(String id, String nombre){
        List<Producto> data;
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        try{
            HashMap<String, String> hm = new HashMap<>();
            hm.put("id", "%"+id.toUpperCase()+"%");
            hm.put("nombre", "%"+nombre.toUpperCase()+"%");
            data = (List)sqlsession.selectList("Data.Almacen.ServicioProducto.filtrarProductos", hm);
        }finally{
            sqlsession.close();
        }
        return data;
    }
    
    public List<Kardex> obtenerKardex(){
        List<Kardex> data;
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        try{
            data = (List)sqlsession.selectList("Data.Almacen.ServicioProducto.kardex");
        }finally{
            sqlsession.close();
        }
        return data;
    }
    
    public List<ProductoxAlmacen> filtrarProductosporAlmacen(String idAlmacen, String id){
        List<ProductoxAlmacen> data;
        try (SqlSession sqlsession = SessionFac.SessionFactory().openSession()) {
            HashMap<String, String> hm = new HashMap<>();
            if(id != null){
                hm.put("id", "%"+id.toUpperCase()+"%");
            }else{
                hm.put("id", "%%");
            }
            hm.put("idalmacen", idAlmacen);
            data = (List)sqlsession.selectList("Data.Almacen.ServicioProducto.filtrarProductosporAlmacen", hm);
            sqlsession.close();
        }
        return data;
    }
    
    public void actualizarProductoxAlmacen(List<ProdxSolicitudMovimiento> prodxSolMov, String idAlmacen, String tipo){
        try (SqlSession sqlsession = SessionFac.SessionFactory().openSession()) {
            for(int i=0; i<prodxSolMov.size(); i++){
                HashMap<String, String> hm = new HashMap<>();
                hm.put("idalmacen", idAlmacen);
                hm.put("idproducto", prodxSolMov.get(i).getIdProducto());
                ProductoxAlmacen prodAlm = sqlsession.selectOne("Data.Almacen.ServicioProducto.verificarProductoxAlmacen", hm);
                if(prodAlm == null){
                    this.agregarProductoporAlmacen(new ProductoxAlmacen(prodxSolMov.get(i).getIdProducto(), idAlmacen, prodxSolMov.get(i).getCantidad(), new Date(), "1"));
                }else{
                    if(tipo.compareTo("Entrada")==0){
                        prodAlm.setCantidad(prodAlm.getCantidad()+prodxSolMov.get(i).getCantidad());
                    }else{
                        prodAlm.setCantidad(prodAlm.getCantidad()-prodxSolMov.get(i).getCantidad());
                    }
                    this.modificarProductoporAlmacen(prodAlm);
                }
                
            }
            sqlsession.close();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
    
    public void modificarProductoporAlmacen(ProductoxAlmacen prodAlm){
        try (SqlSession sqlsession = SessionFac.SessionFactory().openSession()) {
            sqlsession.update("Data.Almacen.ServicioProducto.modificarProductoxAlmacen", prodAlm);
            sqlsession.commit();
            sqlsession.close();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
    
    public void agregarProductoporAlmacen(ProductoxAlmacen prodAlm){
        try (SqlSession sqlsession = SessionFac.SessionFactory().openSession()) {
            sqlsession.insert("Data.Almacen.ServicioProducto.agregarProductoxAlmacen", prodAlm);
            sqlsession.commit();
            sqlsession.close();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
    
    public void guardar(Producto producto){
        try (SqlSession sqlsession = SessionFac.SessionFactory().openSession()) {
            producto.setIdProducto(obtenerIdSiguiente(producto.getIdTipoProducto(), sqlsession));
            sqlsession.insert("Data.Almacen.ServicioProducto.guardar", producto);
            sqlsession.commit();
            sqlsession.close();
        }
    }
    
    public void eliminar(String Id){
        try (SqlSession sqlsession = SessionFac.SessionFactory().openSession()) {
            sqlsession.update("Data.Almacen.ServicioProducto.eliminar", Id);
            sqlsession.commit();
            sqlsession.close();
        }
    }
    
    public void actualizar(Producto producto){
        try (SqlSession sqlsession = SessionFac.SessionFactory().openSession()) {
            sqlsession.update("Data.Almacen.ServicioProducto.actualizar", producto);
            sqlsession.commit();
            sqlsession.close();
        }
    }
    
    public void actualizarLista(List<Producto> producto){
        try (SqlSession sqlsession = SessionFac.SessionFactory().openSession()) {
            for(int i=0 ; i<producto.size(); i++){
                sqlsession.update("Data.Almacen.ServicioProducto.actualizar", producto.get(i));
            }
            sqlsession.commit();
            sqlsession.close();
        }
    }
    
    public String obtenerIdSiguiente(String idTipoProducto, SqlSession sqlsession){
        HashMap<String,String> hm = (HashMap<String,String>)sqlsession.selectOne("Data.Almacen.ServicioProducto.seleccionarMaxId", idTipoProducto);
        Long maxId = hm!=null?Long.parseLong(hm.get("idproducto").substring(3)):Long.parseLong("0");
        maxId++;
        int cifras = ((int)(Math.log10(maxId)));
        String codigo = "";
        for(int i=0; i<(5-cifras); i++){
            codigo = codigo + "0";
        }
        codigo = codigo + maxId;
        ServicioTipoProducto stp =  new ServicioTipoProducto();
        String nombre = stp.obtenerNombre(idTipoProducto.toUpperCase(), sqlsession).substring(10,13);
        return (nombre.toUpperCase()+codigo);
    }
    
    
    public HashMap<String,Long> seleccionarMaxId(SqlSession sqlsession,String Nombre){
        HashMap<String,Long> data = (HashMap<String,Long>)sqlsession.selectOne("Data.Almacen.ServicioProducto.seleccionarMaxId",Nombre.toUpperCase()+"-%");
        return data;
    }
    
    public List<Producto> seleccionarTodo(){
        List<Producto> data;
        try (SqlSession sqlsession = SessionFac.SessionFactory().openSession()) {
            data = (List)sqlsession.selectList("Data.Almacen.ServicioProducto.seleccionarTodo");
            sqlsession.close();
        }
        return data;
    }

    void guardar(ArrayList<Producto> productos) throws Exception{
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        
        for(int i=0; i<productos.size(); i++){
            Producto producto = productos.get(i);
            producto.setIdProducto(obtenerIdSiguiente(producto.getIdTipoProducto(), sqlsession));
            sqlsession.insert("Data.Almacen.ServicioProducto.guardar", producto);
        }   
            sqlsession.commit();
            sqlsession.close();
    }
    
    public boolean SePuedeEliminarProducto(String codProd){
         SqlSession sqlsession= SessionFac.SessionFactory().openSession();
         try{
            if(sqlsession.selectList("Data.Almacen.ServicioProducto.SePuedeEliminar", codProd).size()>0) return false;
            else return true;
         }
         catch(Exception e){
             e.printStackTrace();
             return false;
         }  
         finally{
             sqlsession.close();
         }
    }
}
